#pragma once
#include "InfoArista.h"
#include "Path.h"
#include <string>
#include <unordered_set>
#include <list>

using namespace std::tr1;

//eliminacion y busqueda constante de nodos
typedef unordered_set<InfoVertice,InfoVerticeHash,InfoVerticeEqual> InfoVerticeSet;

class Red
{
public:

	Red(void);
	Red(const Red *);

	int getCantidadNodos();
	int getCantidadNodosTerminales();
	int getCantidadNodosSteiner();

	InfoVerticeSet& getNodos();

	InfoVertice getInfoVertice(int idNodo);

	int getCantidadAristas();

	InfoArista getInfoArista(int i, int j);
	list<InfoArista>& getAdyacentesNodo(int idNodo);

	InfoVerticeSet& getNodosTerminales();

	void leer(string & archivo);

	//de construccion de soluciones
	Red(int cantTotalNodos);

	void agregarNodo(InfoVertice &iv);
	bool existeNodo(InfoVertice &iv);
	void removerNodos(InfoVerticeSet &nodosSet);

	void eliminarArista(InfoArista & ia);

	void agregarKeyPath(Path &p, Red *grafoBase);

	double getCosto();

	~Red(void);

private:
	
	InfoVerticeSet nodos;
	InfoVerticeSet nodosTerminales;
	vector<vector<InfoArista>> matrizAdyacencias;
	vector<list<InfoArista>> listaAdyacencias;
	
	int cantNodos, cantNodosSteiner, cantNodosTerminales;
	int cantAristas;

	double costoSol;

	//de construccion (no usar directamente!)
	void eliminarNodo(InfoVertice iv);
	void eliminarAristaDeLista(list<InfoArista> &listaAdy, int idNodo);
	void agregarArista(InfoVertice &iv1, InfoVertice &iv2, double costo);

};
